#pragma GCC optimize(2, "Ofast", "inline")
#include <iostream>
#include <vector>
#include <algorithm>
#define endl '\n'
#define int long long
using namespace std;


int n, m;
vector<int> x(500005);
vector<int> diffs;

void input()
{
    cin >> n >> m;
    for (int i = 0; i < n; ++i)
    {
        cin >> x[i];
    }
    sort(x.begin(), x.begin()+n);
}

int f()
{
    // 计算差分数组
    for (int i = 1; i < n; ++i)
    {
        diffs.push_back(x[i] - x[i - 1]);
    }
    // 将差分数组从大到小排序
    sort(diffs.begin(), diffs.end(), greater<int>());
    // m个基站m-1段，最大的m-1个差分会被覆盖掉，会被别的基站所影响
    int sum = 0;
    for (int i = 0; i < m - 1; ++i) 
    {
        sum += diffs[i];
    }
    // 总代价 = 整个区间的长度 - 跳过的差分和，每个恰好覆盖一次不会被基站重叠覆盖
    int l = x[n - 1] - x[0];
    return l - sum;
}
signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    input();
    // 如果基站数量大于等于房子数量，每个房子单独一个基站（信号强度0）
    if (m >= n)
    {
        cout << 0 << endl;
        return 0;
    }
    // 如果只需要一个基站
    if (m == 1)
    {
        cout << x[n - 1] - x[0] << endl;
        return 0;
    }
    cout << f();
    return 0;
}